home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / FLOAT.SA < prev    next >
Text File  |  1987-03-04  |  2KB  |  137 lines

  1.  NAM FLOAT
  2. ******************************************************
  3. *
  4. * PROCEDURE FLOAT
  5. *    FLOAT CONVERTS A BINARY INTEGER TO A FLOATING
  6. * REPRESENTATION. THE INPUT ARGUMENT CAN EIHTER BE
  7. * A 16 OR 32 BIT SIGNED INTEGER. IF THE ARGUMENT
  8. * IS 32 BIT LONG AND THE DESTINATION IS SINGLE
  9. * THEN THE VALUE IS ROUNDED ONCE.
  10. *
  11. *  ON ENTRY:
  12. *     U IS A STACK FRAME POINTER
  13. *
  14. *  ON EXIT:
  15. *     RESULT CONTAINS A FLOATING VALUE REPRESENTING
  16. *     THE BINARY INTEGER.
  17. *
  18. FLOAT EQU  *
  19. *
  20.  LEAX  RESULT,U
  21.  LDB  #ARGSIZ-1
  22.  WHILE    B,GE,#00
  23.    CLR    B,X
  24.    DECB
  25. *
  26.  ENDWH
  27. *
  28. * SET EXPONENT TO PROPER VALUE
  29. *
  30.  LDA  FUNCT,U               CHECK FUNCTION
  31.  IF  A,EQ,#FCFLTS           SINGLE PRECISION FLOAT
  32.    LEAY  SINTSZ,PCR
  33. *
  34.  ELSE
  35.    LEAY  DINTSZ,PCR           DOUBLE PRECISION FLOAT
  36. *
  37.  ENDIF
  38. *
  39. * MOVE INTEGER TO RESULT
  40. *
  41.  MOVD  (0,Y),(EXPR,U)
  42. *
  43.  MOVD  (FRACT2,U),(FRACTR,U)
  44.  LDA FUNCT,U              CHECK FUNCTION
  45.  IF  A,EQ,#FCFLTD          DOUBLE PREC. FLOAT
  46.    MOVD  (FRACT2+2,U),(FRACTR+2,U)
  47. *
  48.  ENDIF
  49. *
  50. * CHECK SIGN OF INTEGER AND NEGATE THE INTEGER
  51. * IF NECESSARY.
  52. *
  53.  LDA  FRACTR,U
  54.  IFCC  LT              SIGN NEGATIVE
  55.    LDA    #$80              SET SIGN NEGATIVE
  56.    STA    RESULT,U
  57. *
  58.    LEAX  FRACTR,U
  59.    LDA    FUNCT,U           CHECK FUNCTION
  60.    IF  A,EQ,#FCFLTS          SINGLE PRECISION
  61.      COM  0,X
  62.      NEG  1,X
  63.      BCS  OUT
  64.      INC  0,X
  65. *
  66.    ELSE
  67.      COM  0,X
  68.      COM  1,X
  69.      COM  2,X
  70.      NEG  3,X
  71.      BCS  OUT
  72.      INC  2,X
  73.      BNE  OUT
  74.      INC  1,X
  75.      BNE  OUT
  76.      INC  0,X
  77. *
  78.    ENDIF          SINGLE  PRECISION
  79. *
  80. OUT EQU  *
  81. *
  82.  ENDIF            INTEGER NEGATIVE
  83. *
  84. * NORMALIZE RESULT
  85. *
  86.  LEAX  RESULT,U
  87. *
  88.  LBSR  SNORM
  89. *
  90. * IF THE ARGUMENT WAS 32 BITS LONG AND THE PRECISION
  91. * IS SINGLE, THEN ROUND THE RESULT TO YIELD EXACT
  92. * REPRESENTATION
  93. *
  94.  LDA  FUNCT,U
  95.  IF  A,EQ,#FCFLTD        DOUBLE PRECISION FLOAT
  96.    LDA    [PFPCB,U]
  97.    ANDA  #BIT7+BIT6+BIT5
  98.    IF  A,EQ,#PRSIN       SINGLE PRECISION
  99.      BRA  RND
  100. *
  101.    ELSE
  102.    IF A,EQ,#PREFS        FORCE TO SINGLE
  103. *
  104. RND EQU  *
  105. *
  106.      LDB  #FRACT+3          G-BYTE OFFSET
  107.      LDA  B,X            GET G-BYTE
  108.      LSLA            GET RID OF MSBIT
  109. *
  110.      INCB
  111.      WHILE  B,LT,#(ARGSIZ-1)
  112.        ORA  B,X
  113.        INCB
  114. *
  115.      ENDWH
  116. *
  117.      STA  STIKY,U         SET STIKY BYTE
  118. *
  119.      LBSR  ROUND         ROUND RESULT
  120. *
  121.    ENDIF
  122.    ENDIF             SINGLE PRECISION
  123. *
  124.  ENDIF                DOUBLE PRECISION FLOAT
  125. *
  126. *
  127.  RTS      RETURN
  128. *
  129. *
  130. * INTEGER SIZE TABLE
  131. *
  132. SINTSZ    FDB  15
  133. DINTSZ    FDB  31
  134. *
  135. *
  136. *
  137.